package com.start.form.engine.core;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.start.common.dataRule.StartQueryWrapper;
import com.start.common.exceptions.StartBusException;
import com.start.form.engine.core.entity.StartFormConfig;
import com.start.form.engine.core.model.StartFormConfigModel;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.exceptions.TooManyResultsException;

import java.util.List;

public interface TableDataEngineService extends ITableInfo {


    Page<?> page(StartFormConfig config, Page<?> page, StartQueryWrapper query);

    /**
     * 列表获取
     */


    List<JSONObject> list(StartFormConfig config, StartQueryWrapper query);


    /**
     * 根据id获取数据
     */
    default JSONObject getById(String tableId, String dataId) {
        StartFormConfigModel table = getTable(tableId);
        return getById(table, dataId);
    }

    /**
     * 根据id获取数据
     */
    default JSONObject getById(StartFormConfig config, String dataId) {
        if (StringUtils.isEmpty(dataId)) {
            throw new StartBusException("dataId is not null or data is not empty");
        }
        StartQueryWrapper wrapper = new StartQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        return getOne(config, wrapper, true);
    }

    /**
     * 获取一个数据
     */
    default JSONObject getOne(String tableId, StartQueryWrapper query) {
        return getOne(tableId, query, true);
    }

    default JSONObject getOne(String tableId, StartQueryWrapper query, boolean throwEx) {
        return getOne(getTable(tableId), query, throwEx);
    }

    default JSONObject getOne(StartFormConfig config, StartQueryWrapper query) {
        return getOne(config, query, true);
    }

    default JSONObject getOne(StartFormConfig config, StartQueryWrapper query, boolean throwEx) {
        long count = count(config, query);
        if (count < 1) return null;
        if (count > 1 && throwEx) throw new TooManyResultsException();
        List<JSONObject> list = list(config, query);
        return list.get(0);
    }

    /**
     * 保存表数据
     *
     * @param tableId
     * @param data
     * @return 返回数据Id
     */
    default String save(String tableId, JSONObject data) {
        return save(getTable(tableId), data);
    }

    String save(StartFormConfig config, JSONObject data);

    /**
     * 根据id修改数据
     *
     * @param tableId 数据表id
     * @param dataId  数据id
     * @param data    需要修改的数据
     * @return
     */
    default boolean updateById(String tableId, String dataId, JSONObject data) {
        return updateById(getTable(tableId), dataId, data);
    }

    default boolean updateById(StartFormConfig config, String dataId, JSONObject data) {
        StartQueryWrapper wrapper = new StartQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        return update(config, data, wrapper) > 0;
    }

    /**
     * 修改数据
     *
     * @param tableId
     * @param data
     * @param queryWrapper
     * @return
     */
    default long update(String tableId, JSONObject data, StartQueryWrapper queryWrapper) {
        return update(getTable(tableId), data, queryWrapper);
    }

    long update(StartFormConfig config, JSONObject data, StartQueryWrapper queryWrapper);

    /**
     * 删除数据
     */
    default boolean removeById(String tableId, String dataId) {
        return removeById(getTable(tableId), dataId);
    }

    default boolean removeById(StartFormConfig config, String dataId) {
        if (StringUtils.isEmpty(dataId)) throw new StartBusException("dataId is not null or dataId is not empty");
        StartQueryWrapper wrapper = new StartQueryWrapper();
        wrapper.eq(COLUMN_PK_NAME, dataId);
        remove(config, wrapper);
        return true;
    }

    default long remove(String tableId, StartQueryWrapper queryWrapper) {
        return remove(getTable(tableId), queryWrapper);
    }


    long remove(StartFormConfig config, StartQueryWrapper queryWrapper);

    /**
     * 查询数据数量
     *
     * @param tableId 数据表id
     * @return
     */
    default long count(String tableId) {
        return count(getTable(tableId));
    }

    /**
     * 查询数据数量
     *
     * @param config
     * @return
     */
    default long count(StartFormConfig config) {
        return count(config, new StartQueryWrapper());
    }

    /**
     * 查询数据数量
     *
     * @param config       数据表配置
     * @param queryWrapper 查询条件
     * @return
     */
    long count(StartFormConfig config, StartQueryWrapper queryWrapper);


}
